﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar.Metro;
using ProductManagement.Ultilities;
using ProductManagement.Forms;
using DevComponents.DotNetBar;

namespace ProductManagement.Forms
{
    /// <summary>
    /// Form sửa chi tiết báo cáo
    /// </summary>
    public partial class EditReportDetail : MetroForm
    {
        #region Các trường

        /// <summary>
        /// ID của chi tiết báo cáo muốn sửa
        /// </summary>
        private int _id;
        /// <summary>
        /// ID của báo cáo chứa chi tiết báo cáo muốn sửa
        /// </summary>
        private int _rid;
        /// <summary>
        /// Đối tượng kiểm tra tính hợp lệ của dữ liệu nhập vào
        /// </summary>
        private Validator validator = new Validator();
        /// <summary>
        /// ReportForm gọi tới form này
        /// </summary>
        private ReportForm _reportForm;
        /// <summary>
        /// Đối tượng liên kết dữ liệu LinQ to SQL, để thực hiện các thao tác với cơ sở dữ liệu
        /// </summary>
        private ProductManagementClassesDataContext db = new ProductManagementClassesDataContext();

        #endregion

        #region Hàm khởi tạo

        /// <summary>
        /// Hàm khởi tạo không tham số
        /// </summary>
        public EditReportDetail()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Hàm khởi tạo 3 tham số
        /// </summary>
        /// <param name="reportDetailID">ID của chi tiết báo cáo</param>
        /// <param name="reportID">ID của báo cáo</param>
        /// <param name="reportForm">ReportForm gọi tới form này</param>
        public EditReportDetail(int reportDetailID, int reportID, ReportForm reportForm)
        {
            _id = reportDetailID;
            _rid = reportID;
            _reportForm = reportForm;
            InitializeComponent();
        }

        #endregion

        #region Các phương thức khác

        /// <summary>
        /// Kiểm tra tính hợp lệ của dữ liệu nhập vào
        /// </summary>
        /// <returns>true nếu hợp lệ, false nếu không hợp lệ</returns>
        private bool ValidateReportDetailData()
        {
            bool isValidName = validator.ValidateName(txtEditReportDetailName, errorProvider1);
            bool isValidQuantity = validator.ValidateQuantity(txtEditReportDetailQuantity, errorProvider1);
            bool isValidPrice = validator.ValidatePrice(txtEditReportDetailPrice, errorProvider1);
            return (isValidName && isValidPrice && isValidQuantity);
        }

        /// <summary>
        /// Xóa các trường text, xóa báo lỗi
        /// </summary>
        private void ResetTextFields()
        {
            txtEditReportDetailName.ResetText();
            txtEditReportDetailPrice.ResetText();
            txtEditReportDetailQuantity.ResetText();
            errorProvider1.Dispose();
        }

        /// <summary>
        /// Hiển thị thông tin chi tiết báo cáo muốn sửa
        /// </summary>
        private void DisplayReportDetailData()
        {
            var reportDetail = db.sp_GetReportDetailInfo(_id).SingleOrDefault();
            txtEditReportDetailName.Text = reportDetail.name;
            txtEditReportDetailPrice.Text = reportDetail.price.ToString();
            txtEditReportDetailQuantity.Text = reportDetail.quantity.ToString();
        }

        #endregion

        #region Xử lý sự kiện

        /// <summary>
        /// Sự kiện thoát form
        /// </summary>
        private void EditReportDetail_FormClosed(object sender, FormClosedEventArgs e)
        {
            _reportForm.LoadReportDetailDgv();
        }

        /// <summary>
        /// Sự kiện load form
        /// </summary>
        private void EditReportDetail_Load(object sender, EventArgs e)
        {
            DisplayReportDetailData();
        }

        /// <summary>
        /// Sự kiện nhấn nút OK (thoát form)
        /// </summary>
        private void btnExitEditReportDetail_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        /// <summary>
        /// Sự kiện nhấn nút Nhập lại (xóa các trường text, xóa báo lỗi)
        /// </summary>
        private void btnResetEditReportDetail_Click(object sender, EventArgs e)
        {
            ResetTextFields();
        }

        /// <summary>
        /// Sự kiện nhấn nút Sửa (sửa chi tiết báo cáo)
        /// </summary>
        private void btnEditReportDetail_Click(object sender, EventArgs e)
        {
            if (ValidateReportDetailData())
            {
                //Hiển thị hộp thoại lựa chọn, lưu lựa chọn của người dùng vào biến dr
                DialogResult dr = MessageBoxEx.Show("Bạn có muốn sửa chi tiết báo cáo?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                //Nếu người dùng chọn Yes
                if (dr == DialogResult.Yes)
                {
                    string name = txtEditReportDetailName.Text;
                    int quantity = Int32.Parse(txtEditReportDetailQuantity.Text);
                    decimal price = Decimal.Parse(txtEditReportDetailPrice.Text);
                    //Cập nhật thông tin chi tiết báo cáo vào cơ sở dữ liệu
                    db.sp_UpdateReportDetail(_id, _rid, name, price, quantity);
                }
            }
        }

        #endregion
    }
}
